package com.yunyao.dao.service.act.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunyao.dao.mapper.ActHiVarinstMapper;
import com.yunyao.dao.model.ActHiVarinst;
import com.yunyao.dao.service.act.IActHiVarinstService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xingjishuai
 * @since 2024-07-02
 */
@Service
public class ActHiVarinstServiceImpl extends ServiceImpl<ActHiVarinstMapper, ActHiVarinst> implements IActHiVarinstService {

    /**
     * 根据流程实例ID和变量名称查询历史变量实例
     *
     * 此方法用于从数据库中检索特定流程实例的历史变量实例通过结合流程实例ID和变量名称，
     * 可以准确地定位到唯一的变量实例这种方式相比于直接通过流程实例ID查询所有变量，
     * 再进行过滤，可以更高效地获取到需要的变量实例
     *
     * @param processInstanceId 流程实例ID，用于确定需要查询的流程实例
     * @param name 变量名称，用于进一步确定具体的变量实例
     * @return 返回符合条件的历史变量实例如果找不到，则返回null
     */
    @Override
    public ActHiVarinst getByProcessInstanceIdAndName(String processInstanceId,
                                                                    String name) {
        // 创建查询条件封装器，并设置查询条件
        LambdaQueryWrapper<ActHiVarinst> wrapper = new LambdaQueryWrapper<ActHiVarinst>()
                .eq(ActHiVarinst::getProcInstId, processInstanceId)
                .eq(ActHiVarinst::getName, name);
        // 使用封装器执行查询，并返回查询结果
        return getOne(wrapper);
    }

    /**
     * 结束更新流程变量
     * 本方法用于在流程实例更新结束后，更新流程变量的历史信息
     * 它根据流程实例ID、变量名称和变量类型查询对应的流程变量历史记录，
     * 并更新其版本号和最后更新时间
     *
     * @param processInstanceId 流程实例ID，用于定位具体的流程实例
     * @param name 变量名称，与流程变量的名称对应
     * @param varType 变量类型，描述流程变量的类型
     */
    @Override
    public void endUpdate(String processInstanceId, String name, String varType) {
        // 创建查询条件，用于精确查询流程变量历史记录
        LambdaQueryWrapper<ActHiVarinst> wrapper = new LambdaQueryWrapper<ActHiVarinst>()
                .eq(ActHiVarinst::getProcInstId, processInstanceId)
                .eq(ActHiVarinst::getName, name)
                .eq(ActHiVarinst::getVarType, varType);

        // 根据查询条件获取流程变量历史记录
        ActHiVarinst actHiVarinst = getOne(wrapper);
        // 更新流程变量历史记录的版本号，每次更新增加1
        actHiVarinst.setRev(actHiVarinst.getRev() + 1);
        // 设置流程变量历史记录的最后更新时间
        actHiVarinst.setLastUpdatedTime(new Date());

        // 更新流程变量历史记录的信息
        updateById(actHiVarinst);
    }

    /**
     * 根据流程实例ID列表查询历史变量实例列表
     *
     * @param processInstanceIdList 流程实例ID列表
     * @return 历史变量实例列表
     */
    @Override
    public List<ActHiVarinst> listByProcessInstanceIdList(List<String> processInstanceIdList) {
        // 当流程实例ID列表为空时，直接返回空列表
        if (CollectionUtils.isEmpty(processInstanceIdList)) {
            return List.of();
        }
        // 构建查询条件，使用LambdaQueryWrapper简化查询条件的设置
        LambdaQueryWrapper<ActHiVarinst> wrapper = new LambdaQueryWrapper<ActHiVarinst>()
                .in(ActHiVarinst::getProcInstId, processInstanceIdList);
        // 执行查询并返回结果
        return list(wrapper);
    }
}
